package com.colabo.j2ee.web.core.exception;

/**
 * 消息机制异常类，增加了对消息对象的封装，子类按照实际需要选择几个方法重写即可
 */
public class MessageException extends WrappedException implements java.io.Serializable {
	private static final long serialVersionUID = 1L;

	protected ReadableMessage msgObj;

	private String tipmsg;
	/**
	 * 构造1，默认
	 */
	public MessageException() {
		super();
	}

	/**
	 * 构造2，包含一个消息对象
	 */
	public MessageException(ReadableMessage msgObj) {
		super();
		setMsgObj(msgObj);
	}

	/**
	 * 构造3，包含一个消息提示
	 */
	public MessageException(String msg) {
		super(msg);
		this.tipmsg=msg;
	}

	/**
	 * 构造4，包含一个消息提示和一个消息对象
	 */
	public MessageException(String msg, ReadableMessage msgObj) {
		super(msg);
		setMsgObj(msgObj);
	}

	/**
	 * 构造5，包含一个异常源,但要注意，这里的Throwable异常源指的是MessageException类型的，因此，在子类中，要注意本构造函数的参数类型
	 */
	public MessageException(Throwable ex) {
		super(); 
		if (ex instanceof MessageException && ((MessageException)ex).stackTraceString!=null) {
			t = ex;
			stackTraceString = ((MessageException) t).stackTraceString;
			setMsgObj(((MessageException) ex).getMsgObj());
		} else{
			t = ex;
			stackTraceString = extractStackTraceString(t);
			setMsgObj(new ReadableMessage(""));// 如果不是MessageException子类异常，重新构造一个SysMessage对象
		}
	}

	/**
	 * 构造6，包含一个异常源，一个消息对象
	 */
	public MessageException(ReadableMessage msgObj, Throwable ex) {
		super();
		//当为平台异常类型且stackTraceString不为空时，表明是从基本异常转化过来的，如throw new DAOException(msg,基本异常)可直接取出stackTraceString
		if (ex instanceof MessageException && ((MessageException)ex).stackTraceString!=null) {
			t = ex;
			stackTraceString = ((MessageException) t).stackTraceString;
			setMsgObj(msgObj);
		} else  {//当不是平台异常类型（刚捕获的基础异常），或者为平台异常类型且stackTraceString为空时（开发人员在需要的地方直接抛出平台异常类型） 
			t = ex;
			stackTraceString = extractStackTraceString(t);
			setMsgObj(msgObj);
		}
	}

	/**
	 * 构造7，包含一个异常源，一个消息提示
	 */
	public MessageException(String msg, Throwable ex) {
		super(msg);
		t = ex;
		stackTraceString = extractStackTraceString(t);
		msgObj = extractMsgObj(ex);
	}

	/**
	 * 构造8，包含一个异常源，一个消息提示，一个消息对象
	 */
	public MessageException(String msg, ReadableMessage msgObj, Throwable ex) {
		super(msg);
		t = ex;
		stackTraceString = extractStackTraceString(t);
		setMsgObj(msgObj);
	}

	public ReadableMessage getMsgObj() {
		return msgObj;
	}

	public void setMsgObj(ReadableMessage msgObj) {
		this.msgObj = msgObj;
	}

	public ReadableMessage extractMsgObj(Throwable t) {
		if (t instanceof MessageException) {
			return (((MessageException) t).getMsgObj());
		}
		return null;
	}

	/**
	 * 取出异常描述，通常是从配置好的属性文件中获取
	 */
	public String getTip() {
		if (msgObj!=null){
			return msgObj.getMsgInfo();
		}
		//如果msgObj对象为空，则表明构造MessageException（String）时是以明文输入的，而不是异常码
		return tipmsg;
	}

	/**
	 * 取出信息的级别，I,W,E
	 */
	public String getErrorType() {
		if (msgObj!=null){
			return msgObj.getErrorType();
		}	
		return "";
	}
}
